﻿// 503 合并数列2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
http://oj.daimayuan.top/course/22/problem/649

有 n个线性序列，第 i个序列可以表示成 ki×x+bi的形式（x=0,1,2,…）。

现在询问将这些序列的数从小到大合并起来，前 m个数的和是多少（重复出现的数合并后也会多次出现）。

输入格式
输入第一行一个数 n。

接下来 n行每行两个数表示 ki,bi。

最后一行一个数 m。

输出格式
输出一个数表示答案。

样例输入
2
1 2
5 2
8
样例输出
36
样例解释
两个数列分别为 2,3,4,5,6,7,8,…和 2,7,12,…。

数据规模
对于 100%的数据，保证 1≤n≤100000,1≤m≤100000,1≤ki,bi≤1000。
*/


#include <iostream>


using namespace std;

const int N = 100010;
int a[N][2];
int n, m;

bool check(long long x) {
	long long cnt = 0;
	for (int i = 0; i < n; i++) {
		cnt += 1LL*(x - a[i][1]) / a[i][0] +1;
	}

	if (cnt >= m) return true;
	return false;
}


int main()
{

	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i][0] >> a[i][1];
	}
	cin >> m;

	long long l = 0, r = 1e9;
	while (l < r) {
		long long mid = l + r >> 1;
		if (check(mid)) r = mid;
		else l = mid + 1;
	}
	long long sum = 0; long long total = 0;
	for (int i = 0; i < n; i++) {
		long long cnt = 1LL*(l - a[i][1]) / a[i][0] + 1;
		total += cnt;
		sum += 1LL*cnt * a[i][1] + 1LL*(0 + cnt - 1)*cnt  / 2  * a[i][0];
	}
	if (total > m) {
		sum -= (total - 1LL * m) * l;
	}
	cout << sum << endl;

	return 0;
}
 